/****************************************************************
 **                                                             *
 ** Nombre: GestorPresentacionEncuestaDesempenioDocente.java    *
 ** Versión: 1.0.0                                              *
 ** Autor: Alberto de Jesús Castro Becerra                      *
 ** Creado: 6-abril-2013                                        *
 ** Modificado:                                                 *
 ** Diagrama: GAPI v4.7.1                                       *
 ** Caso de uso: MPE1                                           *
 ****************************************************************/
package Servicios;

import DAO.DAOAsignatura;
import DAO.DAOAsignaturasAlumno;
import DAO.DAOHistoricoAsignaturaProfesor;
import DAO.DAOInformacionAlumno;
import DAO.DAOPreguntasEDD;
import DAO.DAOProfesor;
import DAO.DAORelacionAlumnoProgramaEducativo;
import DAO.DAORespuestasEDD;
import Dominio.Asignatura;
import Dominio.AsignaturaOfertaAcademica;
import Dominio.HistoricoAsignaturaProfesor;
import Dominio.PosibleRespuestaEDD;
import Dominio.PreguntaEDD;
import Dominio.Profesor;
import Dominio.RespuestaEDD;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet para responder la peticón AJAX de mostrar la encuesta de desempeño docente para ser
 * respondida por el alumno.
 * @author Alberto
 */
public class GestorPresentacionEncuestaDesempenioDocente extends HttpServlet {

    private final int ESTADO_APROBADA = 0;//Asignatura que el alumno ya curso y Aprovo
    private final int ESTADO_RECURSABLE = 1;//Asignatura que el alumno ya curso y reprobo 
    private final int ESTADO_NO_CURSABLE = 2;//Asignatura que el alumno ya recurso y reprobo
    private final String MOSTRAR_TODOS_LOS_PARES_ASIGNATURA_PROFESOR = "mostrarParesAsignaturaProfesor";
    private final String BUSCAR_TODAS_LAS_PREGUNTAS_DE_LA_EDD = "buscarTodasLasPreguntasDeEDD";
    private final String REGISTRAR_RESPUESTAS = "registrarRespuestas";

    /**
     * Procesa la petición recibida tanto por <code>GET</code> como por <code>POST</code>.
     * Con base al id de la petición (recibido como parámetro), determina el método
     * que procesara la petición recibida.
     * @param request Petición del servlet.
     * @param response Respuesta del servlet.
     * @throws ServletException Si ocurre un problema con el servlet.
     * @throws IOException Si ocurre algún problema de lectura/escritura.
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        String peticion = request.getParameter("id");

        if (peticion != null) {

            if (peticion.equals(MOSTRAR_TODOS_LOS_PARES_ASIGNATURA_PROFESOR)) {
                mostrarParesAsignaturaProfesor(request, response);
            } else if (peticion.equals(BUSCAR_TODAS_LAS_PREGUNTAS_DE_LA_EDD)) {
                buscarTodasLasPreguntasDeLaEDD(request, response);
            } else if (peticion.equals(REGISTRAR_RESPUESTAS)) {
                registrarRespuestas(request, response);
            } else {
                out.println("Ocurrio un error al procesar la peticion");
            }
        } else {
            out.println("Ocurrio un error al procesar la peticion");
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    /**
     * Obtiene las asignaturas cursadas del alumno así como los profesores que
     * impartieron dicha asignatura para ser evaluados por el alumno; prepara
     * la respuesta generando un formulario en forma de tabla para ser 
     * presentada al alumno.
     * @param request Petición del servlet.
     * @param response Respuesta del servlet.
     */
    private void mostrarParesAsignaturaProfesor(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter out = null;
        try {
            out = response.getWriter();
            String nombreUsuario = request.getSession().getAttribute("nombreUsuario").toString();
            if (nombreUsuario != null) {

                DAOInformacionAlumno daoInformacionAlumno = new DAOInformacionAlumno();
                int claveInformacionAlumno = daoInformacionAlumno.obtenerClaveInfoAlumno(nombreUsuario);
                daoInformacionAlumno.cerrarConexionADAOInformacionAlumno();

                DAORelacionAlumnoProgramaEducativo daoRelacionAlumnoPE = new DAORelacionAlumnoProgramaEducativo();
                int clavePE = daoRelacionAlumnoPE.obtenerClavePE(claveInformacionAlumno);
                daoRelacionAlumnoPE.cerrarConexionARelacionAlumnoProgramaEducativo();                            

                DAOAsignaturasAlumno daoAsignaturasAlumno = new DAOAsignaturasAlumno();
                ArrayList<AsignaturaOfertaAcademica> listaAsignaturasAprobadas = daoAsignaturasAlumno.obtenerAsignaturasProfesorPorEstado(claveInformacionAlumno, clavePE, ESTADO_APROBADA);                             
                ArrayList<AsignaturaOfertaAcademica> listaAsignaturasRecursables = daoAsignaturasAlumno.obtenerAsignaturasProfesorPorEstado(claveInformacionAlumno, clavePE, ESTADO_RECURSABLE);               
                ArrayList<AsignaturaOfertaAcademica> listaAsignaturasNoCursables = daoAsignaturasAlumno.obtenerAsignaturasProfesorPorEstado(claveInformacionAlumno, clavePE, ESTADO_NO_CURSABLE);
                daoAsignaturasAlumno.cerrarConexionAAsignaturaAlumno();

                ArrayList<AsignaturaOfertaAcademica> listaAsignatuasEvaluables = new ArrayList<AsignaturaOfertaAcademica>();
                listaAsignatuasEvaluables.addAll(listaAsignaturasAprobadas);
                listaAsignatuasEvaluables.addAll(listaAsignaturasRecursables);
                listaAsignatuasEvaluables.addAll(listaAsignaturasNoCursables);
                
                DAOHistoricoAsignaturaProfesor daoHistoricoAsignaturaProfesor = new DAOHistoricoAsignaturaProfesor();
                ArrayList<HistoricoAsignaturaProfesor> listaHistoricoAsignaturaProfesor = daoHistoricoAsignaturaProfesor.buscarTodosLosParesAsignaturaProfesor();
                daoHistoricoAsignaturaProfesor.cerrarConexion();

                ArrayList<HistoricoAsignaturaProfesor> listaAsignaturaPorfesorEvaluables = new ArrayList<HistoricoAsignaturaProfesor>();

                for (int i = 0; i < listaHistoricoAsignaturaProfesor.size(); i++) {

                    HistoricoAsignaturaProfesor historicoAsignaturaProfesor = listaHistoricoAsignaturaProfesor.get(i);
                    Profesor profesor = historicoAsignaturaProfesor.getProfesor();
                    int claveProfesor = profesor.getClaveProfesor();
                    Asignatura asignatura = historicoAsignaturaProfesor.getAsignatura();
                    int claveAsignatura = asignatura.getClaveAsignatura();

                    for (int j = 0; j < listaAsignatuasEvaluables.size(); j++) {
                        AsignaturaOfertaAcademica asignaturaAprobada = listaAsignatuasEvaluables.get(j);
                        int claveProfesorDeAsignaturaAprobada = asignaturaAprobada.getMaestro().getClaveProfesor();
                        int claveAsignaturaDeAsignaturaAprobada = asignaturaAprobada.getClaveAsignatura();

                        if (claveProfesorDeAsignaturaAprobada == claveProfesor && claveAsignaturaDeAsignaturaAprobada == claveAsignatura) {
                            listaAsignaturaPorfesorEvaluables.add(historicoAsignaturaProfesor);
                        }
                    }
                }

                if (!listaAsignaturaPorfesorEvaluables.isEmpty()) {

                    String respuesta = "<table class=\"estiloGeneral\" border=\"1\">"
                            + "    <th>"
                            + "        Profesor"
                            + "    </th>"
                            + "    <th>"
                            + "        Asignatura"
                            + "    </th>";
                    for (int i = 0; i < listaAsignaturaPorfesorEvaluables.size(); i++) {

                        HistoricoAsignaturaProfesor historicoAsignaturaProfesor = listaAsignaturaPorfesorEvaluables.get(i);

                        Profesor profesor = historicoAsignaturaProfesor.getProfesor();
                        int claveProfesor = profesor.getClaveProfesor();
                        String nombresApellidosProfesor = profesor.getNombre() + " " + profesor.getApellido();

                        Asignatura asignatura = historicoAsignaturaProfesor.getAsignatura();
                        int claveAsignatura = asignatura.getClaveAsignatura();
                        String nombreAsignatura = asignatura.getNombre();

                        respuesta += "    <tr>"
                                + "        <td>"
                                + "            " + nombresApellidosProfesor
                                + "        </td>"
                                + "        <td>"
                                + "            " + nombreAsignatura
                                + "        </td>"
                                + "        <td>"
                                + "            <input type=\"button\" value=\"Evaluar\" onClick=\"evaluarAsignaturaProfesor(" + claveAsignatura + "," + claveProfesor + ")\"/>"
                                + "        </td>"
                                + "    </tr>";
                    }
                    respuesta += "</table>"
                            + "<div id=\"divEncuesta\"></div>";
                    out.println(respuesta);
                } else {
                    out.println("<h3>No se encontraron asignaturas-profesor para evaluar</h3>");
                }


            } else {
                out.println("Ocurrio un error al procesar la peticion");
            }
        } catch (IOException ex) {
            Logger.getLogger(GestorPresentacionEncuestaDesempenioDocente.class.getName()).log(Level.SEVERE, null, ex);
            out.println("Ocurrio un error al procesar la peticion");
        } finally {
            out.close();
        }

    }

    /**
     * Obtiene las preguntas de la encuesta de desempeño docente y prepara el formulario de registro
     * de respuestas para la evaluación de los profesores que impartieron las asignaturas
     * cursadas por el alumno.
     * @param request Petición del servlet.
     * @param response Repuesta del servlet.
     */
    private void buscarTodasLasPreguntasDeLaEDD(HttpServletRequest request, HttpServletResponse response) {

        PrintWriter out = null;

        try {
            out = response.getWriter();

            String claveAsignaturaCadena = request.getParameter("claveAsignatura");
            String claveProfesorCadena = request.getParameter("claveProfesor");

            if (claveAsignaturaCadena != null && claveProfesorCadena != null) {

                int claveAsignatura = Integer.parseInt(claveAsignaturaCadena);
                int claveProfesor = Integer.parseInt(claveProfesorCadena);
                
                String respuesta = "<h1>ENCUESTA DE DESEMPE&Ntilde;O DOCENTE</h1></br>";

                DAOPreguntasEDD daoPreguntasEDD = new DAOPreguntasEDD();
                ArrayList<PreguntaEDD> listaPreguntasEDD = daoPreguntasEDD.buscarTodasLasPreguntasEDD();
                daoPreguntasEDD.cerrarConexionAPreguntasEDD();

                if(!listaPreguntasEDD.isEmpty()) {
                    
                    respuesta += "<div class=\"contenedorFormularioGeneral\">"    
                           + "<table>"
                           + "<th>"
                           +"Pregunta"
                           + "</th>"
                           + "<th>"
                           +"Respuesta"
                           + "</th>";
                    
                    for (int i = 0; i < listaPreguntasEDD.size(); i++) {
                         respuesta += "<tr>";
                        
                        PreguntaEDD preguntaEDD = listaPreguntasEDD.get(i);
                        int clavePregunta = preguntaEDD.getClavePregunta();
                        String pregunta = preguntaEDD.getPregunta();

                        respuesta += "<td>"+ pregunta + "</td>";
                        respuesta += "<td><select id=\"" + clavePregunta + "\">";
                        
                        respuesta += "  <option value=\"0\">Seleccione</option>";

                        ArrayList<PosibleRespuestaEDD> listaPosiblesRespuestas = preguntaEDD.getListaDeRespuestas();
                        for (int j = 0; j < listaPosiblesRespuestas.size(); j++) {
                            PosibleRespuestaEDD posibleRespuestaEDD = listaPosiblesRespuestas.get(j);
                            String posibleRespuesta = posibleRespuestaEDD.getRespuesta();

                            respuesta += "  <option value=\"" + (j + 1) + "\">" + posibleRespuesta + "</option>";
                        }
                        respuesta += "</select></td>";
                        respuesta += "</tr>";
                    }
                    respuesta += "</table>";
                    respuesta += "<input type=\"button\" id=\"registrarRespuestasEDD\"/ value=\"Registrar respuestas\" onClick=\"registrarRespuestasEDD("+claveAsignatura+", "+claveProfesor+")\"/>";
                    respuesta += "</div>";
                }
                else {
                    out.println("No se encontraron preguntas en la EDD");
                }
                out.println(respuesta);
            } else {
                out.println("Ocurrio un error al procesar la peticion");
            }
        } catch (IOException ex) {
            Logger.getLogger(GestorPresentacionEncuestaDesempenioDocente.class.getName()).log(Level.SEVERE, null, ex);
            out.println("Ocurrio un error al procesar la peticion");
        } finally {
            out.close();
        }
    }

    /**
     * Registra las respuestas del alumno sobre la encuesta de desempeño docente
     * para el profesor evaluado.
     * @param request Petición del servlet.
     * @param response Respuesta del servlet.
     */
    private void registrarRespuestas(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter out = null;
        try {
            out = response.getWriter();
            
            HttpSession sesion = request.getSession();
            sesion.setAttribute("asignaturas", null);
            
            String nombreUsuario = request.getSession().getAttribute("nombreUsuario").toString();
            String parametrosID = request.getParameter("parametrosID");
            String parametrosValores = request.getParameter("parametrosValores");
            String claveAsignaturaCadena = request.getParameter("claveAsignatura");
            String claveProfesorCadena = request.getParameter("claveProfesor");
            

            if (nombreUsuario != null && parametrosID != null && parametrosValores != null && !parametrosID.isEmpty() && !parametrosValores.isEmpty() && claveAsignaturaCadena != null && claveProfesorCadena != null) {

                int claveAsignatura = Integer.parseInt(claveAsignaturaCadena);
                int claveProfesor = Integer.parseInt(claveProfesorCadena);
                
                DAOAsignatura daoAsignatura = new DAOAsignatura();
                Asignatura asignatura = daoAsignatura.buscarAsignatura(claveAsignatura);
                daoAsignatura.cerrarConexionAAsignatura();

                DAOProfesor daoProfesor = new DAOProfesor();
                Profesor profesor = daoProfesor.buscarProfesor(claveProfesor);
                daoProfesor.cerrarConexionAProfesor();
                
                ArrayList<RespuestaEDD> listaRespuestasEDDRecibidasDelCliente = new ArrayList<RespuestaEDD>();

                StringTokenizer separadorID = new StringTokenizer(parametrosID, ",");
                StringTokenizer separadorValores = new StringTokenizer(parametrosValores, ",");

                while (separadorID.hasMoreTokens() && separadorValores.hasMoreTokens()) {
                    int idPreguntaEDD = Integer.parseInt(separadorID.nextToken());
                    int respuesta = Integer.parseInt(separadorValores.nextToken());                  
                    
                    PreguntaEDD preguntaEDD = new PreguntaEDD();
                    preguntaEDD.setClavePregunta(idPreguntaEDD);

                    RespuestaEDD respuestaEDD = new RespuestaEDD();                    
                    respuestaEDD.setRespuesta(respuesta);
                    respuestaEDD.setPreguntaEDD(preguntaEDD);
                    respuestaEDD.setAsignatura(asignatura);
                    respuestaEDD.setProfesor(profesor); 
                    respuestaEDD.setNombreUsuario(nombreUsuario); 

                    listaRespuestasEDDRecibidasDelCliente.add(respuestaEDD);
                }


                DAORespuestasEDD daoRespuestasEDD = new DAORespuestasEDD();
                daoRespuestasEDD.registrarRespuestasDeAlumno(listaRespuestasEDDRecibidasDelCliente);
                daoRespuestasEDD.cerrarConexionARespuestasEHE();
                out.println("Respuestas registradas exitosamente");


            } else {
                out.println("Ocurrio un error al procesar la peticion");
            }


        } catch (IOException ex) {
            Logger.getLogger(GestorPresentacionEncuestaHabitosEstudio.class.getName()).log(Level.SEVERE, null, ex);
            out.println("Ocurrio un error al procesar la peticion");
        } finally {
            out.close();
        }
    }
}
